import { BrowserWindow, BrowserWindowConstructorOptions } from 'electron'
import { join } from 'path'

export interface CreateFrame {
  create(): BasicFrame
}

export default class BasicFrame {
  protected frame: BrowserWindow = new BrowserWindow({ show: false })
  protected width = 1000
  protected height = 800
  protected url: string | void

  constructor(url: string | void, userConfig?: Partial<BrowserWindowConstructorOptions>) {
    this.url = url ?? ''
    this.initFrame(userConfig)
  }

  initFrame(userConfig?: Partial<BrowserWindowConstructorOptions>) {
    this.frame = new BrowserWindow({
      width: this.width,
      height: this.height,
      show: false,
      frame: true,
      autoHideMenuBar: true,
      resizable: false,
      maximizable: false,
      icon: join(__dirname, '../../resources/icon.png'),
      webPreferences: {
        preload: join(__dirname, '../preload/index.js'),
        sandbox: false,
        webSecurity: false
      },
      ...userConfig
    })
  }

  getWindow() {
    return this.frame
  }

  show() {
    this.frame.show()
  }

  hide() {
    this.frame.hide()
  }

  isDestroyed() {
    return !this.frame || this.frame.isDestroyed()
  }

  destroy() {
    this.frame.close()
    this.frame.destroy()
  }

  //设置用户是否可以手动最大化窗口。 在Linux上不起作用。
  setMaximizable(flag: boolean) {
    this.frame.setMaximizable(flag)
  }

  // 最大化
  maximize() {
    this.frame.maximize()
  }

  //设置窗口最小化的 width 和height.
  setMinimumSize(width: number, height: number) {
    this.frame.setMinimumSize(width, height)
  }

  //最小化
  minimize() {
    this.frame.minimize()
  }

  //设置用户是否可以手动调整窗口大小。
  setResizable(flag: boolean) {
    this.frame.setResizable(flag)
  }

  //调整窗口的width和 height. 如果 width 或 height 低于任何设定的最小尺寸约束，窗口将对齐到约束的最小尺寸。
  setSize(width: number, height: number) {
    this.frame.setSize(width, height)
  }

  getSize() {
    return this.frame.getSize()
  }

  //将窗口移动到 x 和 y。
  setPosition(x: number, y: number) {
    this.frame.setPosition(x, y)
  }

  reset() {
    this.setResizable(false)
    this.setMaximizable(false)
    this.setMinimumSize(this.width, this.height)
    this.setSize(this.width, this.height)
  }
}
